//package com.tools.generator.utils;
//
//import cn.hutool.core.util.StrUtil;
//import com.tools.common.exception.ToolException;
//import com.tools.common.utils.DateUtils;
//import com.tools.common.utils.StringUtils;
//import com.tools.common.utils.spring.SpringContextUtils;
//import com.tools.generator.DbConstant;
//import com.tools.generator.config.GenerProperties;
//import com.tools.generator.entity.TableEntity;
//import org.apache.commons.io.IOUtils;
//import org.apache.velocity.Template;
//import org.apache.velocity.VelocityContext;
//import org.apache.velocity.app.Velocity;
//
//import java.io.File;
//import java.io.IOException;
//import java.io.StringWriter;
//import java.util.*;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.zip.ZipEntry;
//import java.util.zip.ZipOutputStream;
//
///**
// * 代码生成工具
// * @author 青青
// */
//public class GenUtils {
//
//    /**
//     * 获取模版
//     * @return
//     */
//    public static List<String> getTemplates() {
//        List<String> templates = new ArrayList<>();
//        templates.add("template/Entity.java.vm");
//        templates.add("template/Mapper.xml.vm");
//        templates.add("template/menu.sql.vm");
//        templates.add("template/Service.java.vm");
//        templates.add("template/ServiceImpl.java.vm");
//        templates.add("template/Controller.java.vm");
//        templates.add("template/Mapper.java.vm");
//        templates.add("template/index.vue.vm");
//        templates.add("template/add-or-update.vue.vm");
//        return templates;
//    }
//
//
//    /**
//     * 生成代码
//     * @param table 待生成代码的表集合
//     * @param columns 表中每个字段集合
//     * @param zip
//     */
//    public static void generatorCode(Map<String, String> table,List<Map<String, String>> columns,ZipOutputStream zip) {
//        // 参数信息
//        GenerProperties properties = SpringContextUtils.getBean(GenerProperties.class);
//
//        //是否有BigDecimal 类型的字段
//        boolean hasBigDecimal = false;
//
//        // 是否有list类型
//        boolean hasList = false;
//
//        // 是否有Long的字段
//        boolean hasLong = false ;
//
//
//        //表信息
//        TableEntity tableEntity = new TableEntity();
//        tableEntity.setTableName(table.get("tableName"));
//        tableEntity.setComments(table.get("tableComment"));
//
//        //表名转换成Java类名
//        String className = tableToJava(tableEntity.getTableName(),properties.getTablePrefix());
//        tableEntity.setClassName(className);
//        tableEntity.setClassnameSml(StringUtils.underlineToHumpSmall(className,true));
//
//        //列信息
//        List<ColumnEntity> columsList = new ArrayList<>();
//        for (Map<String, String> column : columns) {
//            ColumnEntity columnEntity = new ColumnEntity();
//            columnEntity.setColumnName(column.get("columnName"));
//            columnEntity.setDataType(column.get("dataType"));
//            columnEntity.setComments(column.get("comments"));
//            columnEntity.setExtra(column.get("extra"));
//
//            //列名转换成Java属性名
//            String attrName = StringUtils.underlineToHumpSmall(columnEntity.getColumnName(),false);
//            columnEntity.setAttrName(attrName);
//            columnEntity.setAttrNameSml(StringUtils.uncapitalize(attrName));
//
//            //列的数据类型，转换成Java类型
//            String columnType = getColumnType(columnEntity.getDataType());
//            // 记 录 字 段 类 型
//            columnEntity.setAttrType(columnType);
//            if (!hasBigDecimal && "BigDecimal".equals(columnType)) {
//                hasBigDecimal = true;
//            }
//            if (!hasList && "array".equals(columnEntity.getExtra())) {
//                hasList = true;
//            }
//            if(!hasLong && "Long".equals(columnType)){
//                hasLong = true;
//            }
//
//            //是 否 主 键
//            if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) {
//                tableEntity.setPk(columnEntity);
//            }
//            columsList.add(columnEntity);
//        }
//        tableEntity.setColumns(columsList);
//
//        //没主键，则第一个字段为主键
//        if (tableEntity.getPk() == null) {
//            tableEntity.setPk(tableEntity.getColumns().get(0));
//        }
//
//        //设置velocity资源加载器
//        Properties prop = new Properties();
//        prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
//        Velocity.init(prop);
//        String mainPath = properties.getMainPath();
//        mainPath = StrUtil.isBlank(mainPath) ? "com.fast" : mainPath;
//
//        //封装模板数据
//        Map<String, Object> map = new HashMap<>(16);
//        map.put("tableName", tableEntity.getTableName());
//        map.put("comments", tableEntity.getComments());
//        map.put("pk", tableEntity.getPk());
//        map.put("className", tableEntity.getClassName());
//        map.put("classname", tableEntity.getClassnameSml());
//        map.put("pathName", tableEntity.getClassnameSml().toLowerCase());
//        map.put("columns", tableEntity.getColumns());
//        map.put("hasBigDecimal", hasBigDecimal);
//        map.put("hasList", hasList);
//        map.put("hasLong", hasLong);
//        map.put("mainPath", mainPath);
//        map.put("package", properties.getPackageName());
//        map.put("moduleName", properties.getModuleName());
//        map.put("author", properties.getAuthor());
//        map.put("email", properties.getEmail());
//        map.put("datetime", DateUtils.getNowDateTimeString());
//        VelocityContext context = new VelocityContext(map);
//
//        //获取模板列表
//        List<String> templates = getTemplates();
//        for (String template : templates) {
//            //渲染模板
//            StringWriter sw = new StringWriter();
//            Template tpl = Velocity.getTemplate(template, "UTF-8");
//            tpl.merge(context, sw);
//            try {
//                //添加到zip
//                zip.putNextEntry(new ZipEntry(getFileName(template, tableEntity.getClassName(), properties.getPackageName(),properties.getModuleName())));
//                IOUtils.write(sw.toString(), zip, "UTF-8");
//                IOUtils.closeQuietly(sw);
//                zip.closeEntry();
//            } catch (IOException e) {
//                throw new ToolException("渲染模板失败，表名：" + tableEntity.getTableName(), e);
//            }
//        }
//    }
//
//    public static Map<String,String> previewCode(Map<String, String> table,List<Map<String, String>> columns) {
//        // 参数信息
//        GenerProperties properties = SpringContextUtils.getBean(GenerProperties.class);
//
//        //是否有BigDecimal 类型的字段
//        boolean hasBigDecimal = false;
//
//        // 是否有list类型
//        boolean hasList = false;
//
//        // 是否有Long的字段
//        boolean hasLong = false ;
//
//
//        //表信息
//        TableEntity tableEntity = new TableEntity();
//        tableEntity.setTableName(table.get("tableName"));
//        tableEntity.setComments(table.get("tableComment"));
//
//        //表名转换成Java类名
//        String className = tableToJava(tableEntity.getTableName(),properties.getTablePrefix());
//        tableEntity.setClassName(className);
//        tableEntity.setClassnameSml(StringUtils.underlineToHumpSmall(className,true));
//
//        //列信息
//        List<ColumnEntity> columsList = new ArrayList<>();
//        for (Map<String, String> column : columns) {
//            ColumnEntity columnEntity = new ColumnEntity();
//            columnEntity.setColumnName(column.get("columnName"));
//            columnEntity.setDataType(column.get("dataType"));
//            columnEntity.setComments(column.get("comments"));
//            columnEntity.setExtra(column.get("extra"));
//
//            //列名转换成Java属性名
//            String attrName = StringUtils.underlineToHumpSmall(columnEntity.getColumnName(),false);
//            columnEntity.setAttrName(attrName);
//            columnEntity.setAttrNameSml(StringUtils.uncapitalize(attrName));
//
//            //列的数据类型，转换成Java类型
//            String columnType = getColumnType(columnEntity.getDataType());
//            // 记 录 字 段 类 型
//            columnEntity.setAttrType(columnType);
//            if (!hasBigDecimal && "BigDecimal".equals(columnType)) {
//                hasBigDecimal = true;
//            }
//            if (!hasList && "array".equals(columnEntity.getExtra())) {
//                hasList = true;
//            }
//            if(!hasLong && "Long".equals(columnType)){
//                hasLong = true;
//            }
//
//            //是 否 主 键
//            if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) {
//                tableEntity.setPk(columnEntity);
//            }
//            columsList.add(columnEntity);
//        }
//        tableEntity.setColumns(columsList);
//
//        //没主键，则第一个字段为主键
//        if (tableEntity.getPk() == null) {
//            tableEntity.setPk(tableEntity.getColumns().get(0));
//        }
//
//        //设置velocity资源加载器
//        Properties prop = new Properties();
//        prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
//        Velocity.init(prop);
//        String mainPath = properties.getMainPath();
//        mainPath = StrUtil.isBlank(mainPath) ? "com.fast" : mainPath;
//
//        //封装模板数据
//        Map<String, Object> map = new HashMap<>(16);
//        map.put("tableName", tableEntity.getTableName());
//        map.put("comments", tableEntity.getComments());
//        map.put("pk", tableEntity.getPk());
//        map.put("className", tableEntity.getClassName());
//        map.put("classname", tableEntity.getClassnameSml());
//        map.put("pathName", tableEntity.getClassnameSml().toLowerCase());
//        map.put("columns", tableEntity.getColumns());
//        map.put("hasBigDecimal", hasBigDecimal);
//        map.put("hasList", hasList);
//        map.put("hasLong", hasLong);
//        map.put("mainPath", mainPath);
//        map.put("package", properties.getPackageName());
//        map.put("moduleName", properties.getModuleName());
//        map.put("author", properties.getAuthor());
//        map.put("email", properties.getEmail());
//        map.put("datetime", DateUtils.getNowDateTimeString());
//        VelocityContext context = new VelocityContext(map);
//
//        //获取模板列表
//        List<String> templates = getTemplates();
//        Map<String, String> dataMap = new LinkedHashMap<>();
//        for (String template : templates) {
//            //渲染模板
//            StringWriter sw = new StringWriter();
//            Template tpl = Velocity.getTemplate(template, "UTF-8");
//            tpl.merge(context, sw);
//            dataMap.put(template, sw.toString());
//        }
//        return dataMap;
//    }
//
//    /**
//     * 表名转换成Java类名 大驼峰
//     * @param tableName 表名称
//     * @param tablePrefixArray 表前缀
//     * @return
//     */
//    public static String tableToJava(String tableName, String[] tablePrefixArray) {
//        if (null != tablePrefixArray && tablePrefixArray.length > 0) {
//            for (String tablePrefix : tablePrefixArray) {
//                if (tableName.startsWith(tablePrefix)){
//                    tableName = tableName.replaceFirst(tablePrefix, "");
//                }
//            }
//        }
//        return StringUtils.underlineToHump(tableName);
//    }
//
//    /**
//     * 获取文件名
//     */
//    public static String getFileName(String template, String className, String packageName, String moduleName) {
//
//        String separator = File.separator;
//
//        String packagePath = "main" + separator + "java" + separator;
//        if (StringUtils.isNotBlank(packageName)) {
//            packagePath += packageName.replace(".", separator) + separator + moduleName + separator;
//        }
//
//        if (template.contains("Entity.java.vm") || template.contains("MongoEntity.java.vm")) {
//            return packagePath + "entity" + separator + className + ".java";
//        }
//
//        if (template.contains("Mapper.java.vm")) {
//            return packagePath + "mapper" + separator + className + "Mapper.java";
//        }
//
//        if (template.contains("Service.java.vm")) {
//            return packagePath + "service" + separator + className + "Service.java";
//        }
//
//        if (template.contains("ServiceImpl.java.vm")) {
//            return packagePath + "service" + separator + "impl" + separator + className + "ServiceImpl.java";
//        }
//
//        if (template.contains("Controller.java.vm")) {
//            return packagePath + "controller" + separator + className + "Controller.java";
//        }
//
//        if (template.contains("Mapper.xml.vm")) {
//            return "main" + separator + "resources" + separator + "mapper" + separator + moduleName + separator + className + "Mapper.xml";
//        }
//
//        if (template.contains("menu.sql.vm")) {
//            return className.toLowerCase() + "_menu.sql";
//        }
//
//        if (template.contains("index.vue.vm")) {
//            return "main" + separator + "resources" + separator + "src" + separator + "views" + separator + "modules" +
//                    separator + moduleName + separator + className.toLowerCase() + ".vue";
//        }
//
//        if (template.contains("add-or-update.vue.vm")) {
//            return "main" + separator + "resources" + separator+ "src" + separator + "views" + separator + "modules" +
//                    separator + moduleName + separator + className.toLowerCase() + "-add-or-update.vue";
//        }
//
//        return null;
//    }
//
//    private static String splitInnerName(String name){
//        name = name.replaceAll("\\.","_");
//        return name;
//    }
//
//    /**
//     * 实体类与数据库字段类型映射
//     * key为数据库字段类型
//     * value为实体类属性类型
//     */
//    private static Map<String,String> dataTypeMap = new ConcurrentHashMap<>();
//    static {
//        // Integer
//        dataTypeMap.put("tinyint","Integer");
//        dataTypeMap.put("smallint","Integer");
//        dataTypeMap.put("mediumint","Integer");
//        dataTypeMap.put("int","Integer");
//        dataTypeMap.put("integer","Integer");
//        dataTypeMap.put("NUMBER","Integer");
//        dataTypeMap.put("INT","Integer");
//        dataTypeMap.put("INTEGER","Integer");
//        dataTypeMap.put("BINARY_INTEGER","Integer");
//        dataTypeMap.put("int4","Integer");
//        dataTypeMap.put("int2","Integer");
//
//        //Long
//        dataTypeMap.put("bigint","Long");
//        dataTypeMap.put("int8","Long");
//        dataTypeMap.put("float","Float");
//        dataTypeMap.put("FLOAT","Float");
//        dataTypeMap.put("BINARY_FLOAT","Float");
//        dataTypeMap.put("double","Double");
//        dataTypeMap.put("DOUBLE","Double");
//        dataTypeMap.put("BINARY_DOUBLE","Double");
//        dataTypeMap.put("decimal","BigDecimal");
//        dataTypeMap.put("DECIMAL","BigDecimal");
//        dataTypeMap.put("numeric","BigDecimal");
//        dataTypeMap.put("bit","Boolean");
//
//        //字符串
//        dataTypeMap.put("char","String");
//        dataTypeMap.put("CHAR","String");
//        dataTypeMap.put("nvarchar","String");
//        dataTypeMap.put("VARCHAR","String");
//        dataTypeMap.put("varchar","String");
//        dataTypeMap.put("VARCHAR2","String");
//        dataTypeMap.put("NVARCHAR","String");
//        dataTypeMap.put("NVARCHAR2","String");
//        dataTypeMap.put("CLOB","String");
//        dataTypeMap.put("BLOB","String");
//        dataTypeMap.put("tinytext","String");
//        dataTypeMap.put("text","String");
//        dataTypeMap.put("mediumtext","String");
//        dataTypeMap.put("longtext","String");
//        dataTypeMap.put("LONG","String");
//
//        //时间
//        dataTypeMap.put("date","Date");
//        dataTypeMap.put("DATE","Date");
//        dataTypeMap.put("DATETIME","Date");
//        dataTypeMap.put("TIMESTAMP","Date");
//        dataTypeMap.put("TIMESTAMP(6)","Date");
//        dataTypeMap.put("datetime","Date");
//        dataTypeMap.put("timestamp","Date");
//    }
//
//    /**
//     * 根据数据库字段类型获取对应的Java属性类型
//     * @param key 数据库字段类型
//     * @return 返回对应的Java类型
//     */
//    public static String getColumnType(String key){
//        return dataTypeMap.get(key);
//    }
//
//    public static boolean getBool(String val){
//        if (StringUtils.isEmpty(val)) {
//            return false;
//        }
//        if (DbConstant.YES.equals(val)){
//            return true;
//        }
//        return false;
//    }
//
//    public static boolean getPrimary(String str){
//        if(!StringUtils.isEmpty(str) && str.contains(DbConstant.PRI)){
//            return true;
//        }
//        return false;
//    }
//
//    public static boolean getAutoIncrement(String str){
//        if(!StringUtils.isEmpty(str) && str.contains(DbConstant.AUTO_INCREMENT)){
//            return true;
//        }
//        return false;
//    }
//}
